package cn.tedu.design;
/**本类用于实现单例设计模式方案2：懒汉式
 * 关于单例设计模式的两种实现方式：
 * 1.饿汉式：不管你用不用这个类的对象，都会直接先创建一个
 * 2.懒汉式：先不给你创建这个类的对象，等你需要的时候再创建----延迟加载的思想
 * 延迟加载的思想：是指不会在第一时间就把对象创建好占用内存
 *              而是什么时候用到，什么时候再去创建对象
 * 3.线程安全问题：由于我们存在唯一的对象single2，并且多条语句都操作了这个变量
 * 所以，如果将程序放在多线程的环境下，就容易出现数据安全的问题
 * 解决方案：
 *     1)将3条语句都是用同步代码块包裹，保证同步排队的效果
 *     2)由于getSingle()方法里也只有这3条语句，所以也可以将getSingle()方法修饰为同步方法
 *  注意：被synchronized修饰的方法被称作同步方法，但是不推荐使用*/
public class Singleton2 {
    public static void main(String[] args) {
        MySingle2 s1 = MySingle2.getMySingle2();
        MySingle2 s2 = MySingle2.getMySingle2();
        System.out.println(s1);
        System.out.println(s2);
    }
}
//1.创建自己的单例程序MySingle2
class MySingle2{
    static Object o = new Object();
    //2.私有化本类的构造方法
    private MySingle2(){}
    //3.创建的是本类对象对应类型的引用类型变量， 用来保存对象的地址值
    //类里方法外的引用类型的成员变量，默认值为null
    static MySingle2 single2;
    //4.提供公共的静态方法，将创建好的对象返回
    public static MySingle2 getMySingle2(){
        synchronized (o){
            if (single2 == null){
            single2 = new MySingle2();
        }
//        single2 = new MySingle2();//调用geiSingle()时创建对象，那么地址值也不一样，不算是单例设计模式
            return single2;}

    }
}
